在之前的實作中,像是 UITableView 或是 UICollectionView ,通常會看到以下片段:
tableView.delegate = self
tableView.datasource = self
上述的 delegate 及 datasource 的目的是什麼呢?
其實兩者的目的是一樣的,都為了讓資料可以在物件(struct 或 class)間傳遞。只不過一個是用來控制 UI event(delegate) 像是選擇 table cell 後該做什麼動作,一個是用來顯示 table cell 內的資料(datasource)。
在這邊舉一個例子來說明 delegate 的使用方法:
試想一個狀況,一個小嬰兒肚子餓了如何吃飯?
在這裡例子中會需要兩個物件,母親(mother)跟嬰兒(baby)
var mother = Mom()
var baby = Baby()
首先母親這個物件為了煮飯因此需要具備煮飯的功能(繼承 CookDelegate 並實作 prepardFood()):
public protocol CookDelegate {
optional public func prepardFood()
}
class Mom: CookDelegate {
func prepardFood() { print("Making food~") }
}
接下來因為嬰兒不會煮飯需要尋找會煮飯的人(也就是母親):
class Baby {
var delegate: CookDelegate? // delegate = someone with special skills
}
最後嬰兒透過母親的協助來讓自己吃飽
baby.delegate = mother // get assist from mom
baby.delegate?needFood() // print Making food~
看過上述的例子之後,回到 Swift 開發實例:
class exampleVC: UIViewController, UITableViewDelegate {
override func viewDidLoad() {
super.viewDidLoad()
let tableView = UITableView()
tableView.delegate = self
}
}
在這實例中包含兩個物件: exampleVC 及 tableView。其中 Delegator 是 tableView,
delegate 是 self (即 exampleVC )。當 tableView 想要實作 didSelectRowAt() 時,因 tableview 這物件本身 delegate 其 type 是 UITableViewDelegate,而 self 又繼承 UITableViewDelegate protocol。因此則可以透過 delegate 來要求 self 來幫忙完成 didSelectRowAt() 的實作。
Reference
Delegate explain in Apple document